//Magnus Baunsgaard Kristensen s140168
//Jonathan Yannick Thomassen s125070

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Locale;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.border.Border;

public class Konsol extends JPanel {

  String brugerKode = "", stadie = "start";
  boolean test = true, sov = false;
  final JFrame mig;
  Billetautomat automat;
  Font skrifttype = new Font("Monospaced", Font.PLAIN, 12);
  Border grønKant = BorderFactory.createLineBorder(Color.GREEN);
  DecimalFormat formatter = (DecimalFormat) DecimalFormat.getInstance(Locale.FRENCH);

  JFrame knapper1 = new JFrame("Knap-Panel");
  JFrame knapper2 = new JFrame("Knap-Panel");
  JFrame numerisk = new JFrame("Numerisk Panel");
  JFrame møntIndkast = new JFrame("Mønt-indkast");

  ArrayList<JLabel> labels = new ArrayList<>();
  ArrayList<JFrame> frames = new ArrayList<>();

  public Konsol(Billetautomat tempAutomat, JFrame tempMig) {
    formatter.applyPattern("#,###,##0.00");

    automat = tempAutomat;
    mig = tempMig;

    for (int i = 0; i < 8; i++) {
      labels.add(new JLabel());
    }

    frames.add(knapper1);
    frames.add(knapper2);
    frames.add(numerisk);

    knapper1.add(new KnapPanel1(this));
    knapper1.setLocation(0, 180);
    knapper1.setSize(105, 295);

    knapper2.add(new KnapPanel2(this));
    knapper2.setLocation(750, 180);
    knapper2.setSize(105, 295);

    numerisk.add(new NumeriskPanel(this));
    numerisk.setLocation(855, 100);
    numerisk.setSize(270, 375);

    for (JFrame frame : frames) {
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.setVisible(true);
    }

    this.setLayout(null);

    for (JLabel label : labels) {
      if (labels.indexOf(label) <= 3) {
        label.setBounds(-1, (190 + (65 * labels.indexOf(label))), 311, 50);
      } else {
        label.setBounds(330, (190 + (65 * (labels.indexOf(label) - 4))), 311, 50);
      }
      label.setBackground(Color.BLACK);
      label.setForeground(Color.GREEN);
      label.setOpaque(true);
      label.setFont(skrifttype);
      label.setBorder(grønKant);
      label.setHorizontalAlignment(SwingConstants.CENTER);
      this.add(label);
    }
  }

  @Override
  public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(Color.BLACK);
    g.fillRect(0, 0, 640, 480);
    g.setFont(skrifttype);
    g.setColor(Color.GREEN);
    g.drawRect(20, 20, 600, 440);
    g.drawString("BlueJ Trafikselskab", 34, 40);

    if (sov) {
      try {
        Thread.sleep(4000);
      } catch (InterruptedException e) {
      }
      sov = false;
      repaint();
    }

    if (test) {
      g.drawString("TEST-tilstand slået til", 250, 40);
    }

    g.drawString("Kurv: (" + automat.getKurvStørrelse() + ")", 550, 40);
    g.drawString(formatter.format(automat.getKurvPris()) + ",-", 570, 60);

    for (JLabel label : labels) {
      label.setText("");
    }

    switch (stadie) {
      case "start":
        labels.get(0).setText("Vælg billet");
        labels.get(1).setText("Vælg klippekort");
        labels.get(2).setText("Gå til kurv");
        labels.get(3).setText("Annullér køb");
        if (test) {
          labels.get(4).setText("Print log");
          labels.get(5).setText("Genstart automat");
          labels.get(7).setText("Forlad test-tilstand");
        }
        break;
      case "klip":
        for (int n = 0; n < automat.getKlippekortTyper().size(); n++) {
          labels.get(n).setText(automat.getKlippekortTyper().get(n).getNavn() + " - " + formatter.format(automat.getKlippekortTyper().get(n).getPris()) + ",-");
        }
        labels.get(7).setText("Tilbage");
        break;
      case "billet":
        for (int n = 0; n < automat.getBilletTyper().size(); n++) {
          labels.get(n).setText(automat.getBilletTyper().get(n).getNavn() + " - " + formatter.format(automat.getBilletTyper().get(n).getPris()) + ",-");
        }
        labels.get(7).setText("Tilbage");
        break;
      case "bekræft":
        for (int n = 0; n < automat.samletKurv().size(); n++) {
          g.drawString(automat.samletKurv().get(n), 50, 100 + n * 20);
        }

        g.drawString("Total: " + formatter.format(automat.getKurvPris()) + ",-", 510, 360);

        labels.get(2).setText("Tøm kurv");
        labels.get(3).setText("Tilbage");
        if (automat.getKurvStørrelse() > 0) {
          labels.get(7).setText("Betal");
        }
        break;
      case "betal":
        g.drawString("At betale: " + formatter.format(automat.getKurvPris()) + ",-", 34, 100);
        g.drawString("Balance: " + formatter.format(automat.getBalance()) + ",-", 34, 120);
        g.drawString("Resterende: " + formatter.format((automat.getKurvPris() - automat.getBalance())) + ",-", 34, 140);

        labels.get(3).setText("Fortryd");
        break;
      case "print":
        g.drawString("Dine billetter udskrives...", 34, 100);
        g.drawString("Tak fordi du valgte at rejse med BlueJ Trafik :-)", 34, 120);

        sov = true;
        stadie = "start";
        break;
      case "admin":
        labels.get(0).setText("Tøm automat");
        labels.get(1).setText("Genstart automat");
        labels.get(2).setText("Sluk automat");
        labels.get(7).setText("Færdig");
        break;
    }

    for (JLabel label : labels) {
      if (label.getText().equals("")) {
        label.setVisible(false);
      } else {
        label.setVisible(true);
      }
    }
  }

  public void numeriskInput(int tal) {
    switch (stadie) {
      case "start":
        if (!test) {
          brugerKode += tal;
        }
        break;
    }
    repaint();
  }

  public void numeriskInput(String kode) {
    switch (stadie) {
      case "start":
        switch (kode) {
          case "ok":
            if (!test) {
              if (brugerKode.equals(automat.getKodeord())) {
                stadie = "admin";
              }
              brugerKode = "";
            }
            break;
        }
        break;
    }
    repaint();
  }

  public void knapInput(String kode) {
    switch (stadie) {
      case "start":
        switch (kode) {
          case "A":
            stadie = "billet";
            break;
          case "B":
            stadie = "klip";
            break;
          case "C":
            stadie = "bekræft";
            break;
          case "E":
            if (test) {
              automat.udskrivLog();
            }
            break;
          case "F":
            if (test) {
              knapper1.dispose();
              knapper2.dispose();
              numerisk.dispose();
              mig.dispose();
              new BenytBilletautomat().start();
            }
            break;
          case "H":
            if (test) {
              test = false;
              automat.reset();
            }
            break;
        }
        break;
      case "billet":
        switch (kode) {
          case "A":
            if (!labels.get(0).getText().equals("")) {
              automat.tilføjBillet(automat.getBilletTyper().get(0));
            }
            break;
          case "B":
            if (!labels.get(1).getText().equals("")) {
              automat.tilføjBillet(automat.getBilletTyper().get(1));
            }
            break;
          case "C":
            if (!labels.get(2).getText().equals("")) {
              automat.tilføjBillet(automat.getBilletTyper().get(2));
            }
            break;
          case "D":
            if (!labels.get(3).getText().equals("")) {
              automat.tilføjBillet(automat.getBilletTyper().get(3));
            }
            break;
          case "E":
            if (!labels.get(4).getText().equals("")) {
              automat.tilføjBillet(automat.getBilletTyper().get(4));
            }
            break;
          case "F":
            if (!labels.get(5).getText().equals("")) {
              automat.tilføjBillet(automat.getBilletTyper().get(5));
            }
            break;
          case "G":
            if (!labels.get(6).getText().equals("")) {
              automat.tilføjBillet(automat.getBilletTyper().get(6));
            }
            break;
          case "H":
            stadie = "start";
            break;
        }
        break;
      case "klip":
        switch (kode) {
          case "A":
            if (!labels.get(0).getText().equals("")) {
              automat.tilføjKlippekort(automat.getKlippekortTyper().get(0));
            }
            break;
          case "B":
            if (!labels.get(1).getText().equals("")) {
              automat.tilføjKlippekort(automat.getKlippekortTyper().get(1));
            }
            break;
          case "C":
            if (!labels.get(2).getText().equals("")) {
              automat.tilføjKlippekort(automat.getKlippekortTyper().get(2));
            }
            break;
          case "D":
            if (!labels.get(3).getText().equals("")) {
              automat.tilføjKlippekort(automat.getKlippekortTyper().get(3));
            }
            break;
          case "E":
            if (!labels.get(4).getText().equals("")) {
              automat.tilføjKlippekort(automat.getKlippekortTyper().get(4));
            }
            break;
          case "F":
            if (!labels.get(5).getText().equals("")) {
              automat.tilføjKlippekort(automat.getKlippekortTyper().get(5));
            }
            break;
          case "G":
            if (!labels.get(6).getText().equals("")) {
              automat.tilføjKlippekort(automat.getKlippekortTyper().get(6));
            }
            break;
          case "H":
            stadie = "start";
            break;
        }
        break;
      case "bekræft":
        switch (kode) {
          case "C":
            automat.rydKurv();
            break;
          case "D":
            stadie = "start";
            break;
          case "H":
            if (automat.getKurvStørrelse() > 0) {
              if (test) {
                stadie = "print";
                automat.købKurv(test);
              } else {
                stadie = "betal";

                møntIndkast.add(new MøntIndkast(this));
                møntIndkast.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                møntIndkast.setLocation(1125, 80);
                møntIndkast.setSize(175, 395);
                møntIndkast.setVisible(true);
              }
            }
            break;
        }
        break;
      case "betal":
        switch (kode) {
          case "D":
            stadie = "bekræft";
            automat.pengeRetur();
            break;
        }
        break;
      case "admin":
        switch (kode) {
          case "A":
            automat.tømMaskine();
            break;
          case "B":
            knapper1.dispose();
            knapper2.dispose();
            numerisk.dispose();
            mig.dispose();
            new BenytBilletautomat().start();
            break;
          case "C":
            System.exit(0);
            break;
          case "H":
            stadie = "start";
            break;
        }
        break;
    }
    brugerKode = "";
    repaint();
  }

  public void møntInput(String kode) {
    switch (stadie) {
      case "betal":
        switch (kode) {
          case "50øre":
            automat.indsætPenge(0.5);
            break;
          case "1kr":
            automat.indsætPenge(1);
            break;
          case "2kr":
            automat.indsætPenge(2);
            break;
          case "5kr":
            automat.indsætPenge(5);
            break;
          case "10kr":
            automat.indsætPenge(10);
            break;
          case "20kr":
            automat.indsætPenge(20);
            break;
        }
        if (automat.købKurv(test)) {
          stadie = "print";
          møntIndkast.dispose();
        }
        break;
    }
    repaint();
  }
}
